Delaware income tax#

Delaware has a single core rate structure that does not vary by filing status. It also has other exemptions, deductions, and credits, including a two-tier federal Earned Income Tax Credit match: filers can claim either a refundable or non-refundable EITC match, but not both.

Examples#

Full income tax#

from policyengine_us import IndividualSim
import pandas as pd
import plotly.express as px

LIGHT_GRAY = "#F5F5F5"
GRAY = "#BDBDBD"
BLUE = "#5091cc"
LIGHT_BLUE = "lightblue"
DARK_BLUE = "darkblue"

COLOR_MAP = {"0": GRAY, "1": LIGHT_BLUE, "2": BLUE, "3": DARK_BLUE}


def make_tax(adults, children):
    sim = IndividualSim(year=2023)
    sim.add_person(name="head", age=25, rent=12_000)
    members = ["head"]
    if adults == 2:
        sim.add_person(name="spouse")
        members += ["spouse"]
    for i in range(children):
        child = "child{}".format(i)
        sim.add_person(name=child, age=6)
        members += [child]
    sim.add_tax_unit(name="tax_unit", members=members)
    sim.add_spm_unit(name="spm_unit", members=members)
    sim.add_household(name="household", members=members, state_code="DE")
    sim.vary("employment_income", max=100_000, step=100)
    return pd.DataFrame(
        dict(
            employment_income=sim.calc("employment_income")[0],
            de_income_tax=sim.calc("de_income_tax")[0].round(),
            de_eitc=sim.calc("de_eitc")[0].round(),
            de_refundable_eitc=sim.calc("de_refundable_eitc")[0].round(),
            de_non_refundable_eitc=sim.calc("de_non_refundable_eitc")[
                0
            ].round(),
            mtr=sim.deriv(
                "de_income_tax", "employment_income", wrt_target="head"
            ),
            adults=adults,
            children=str(children),
        )
    )


# Make a table of state taxes for different numbers of adults and children.
l = []
for adults in range(1, 3):
    for children in range(0, 4):
        l.append(make_tax(adults, children))

df = pd.concat(l)

LABELS = dict(
    employment_income="Employment income",
    de_income_tax="Delaware income tax",
    mtr="State marginal tax rate",
    adults="Adults",
    children="Children",
    de_eitc="Delaware EITC",
    de_refundable_eitc="Delaware refundable EITC",
    de_non_refundable_eitc="Delaware non-refundable EITC",
)

fig = px.line(
    df,
    "employment_income",
    "de_income_tax",
    color="children",
    animation_frame="adults",
    labels=LABELS,
    title="Delaware state income tax",
    color_discrete_map=COLOR_MAP,
)
fig.update_layout(
    xaxis_tickformat="$,",
    yaxis_tickformat="$,",
    plot_bgcolor="white",
    xaxis_gridcolor=LIGHT_GRAY,
    yaxis_gridcolor=LIGHT_GRAY,
)
fig.show()

Core marginal tax rates span from zero to five percent, but when including the EITC, they range from -13.5% to 12.3%, depending on income and household structure.

fig = px.line(
    df,
    "employment_income",
    "mtr",
    color="children",
    animation_frame="adults",
    labels=LABELS,
    title="Delaware state income tax marginal tax rate",
    color_discrete_map=COLOR_MAP,
)
fig.update_layout(
    xaxis_tickformat="$,",
    yaxis_tickformat=".1%",
    plot_bgcolor="white",
    xaxis_gridcolor=LIGHT_GRAY,
    yaxis_gridcolor=LIGHT_GRAY,
)
fig.show()
df
employment_income de_income_tax de_eitc de_refundable_eitc de_non_refundable_eitc mtr adults children
0 0.0 0.0 0.0 0.0 0.0 -0.003443 1 0
1 100.0 -0.0 0.0 0.0 0.0 -0.003443 1 0
2 200.0 -1.0 1.0 1.0 0.0 -0.003443 1 0
3 300.0 -1.0 1.0 1.0 0.0 -0.003442 1 0
4 400.0 -1.0 1.0 1.0 0.0 -0.003443 1 0
... ... ... ... ... ... ... ... ...
996 99600.0 4578.0 0.0 0.0 0.0 0.066001 2 3
997 99700.0 4585.0 0.0 0.0 0.0 0.065996 2 3
998 99800.0 4591.0 0.0 0.0 0.0 0.066001 2 3
999 99900.0 4598.0 0.0 0.0 0.0 0.066001 2 3
1000 100000.0 4604.0 0.0 0.0 0.0 0.066001 2 3

8008 rows × 8 columns

Delaware EITC#

Massachusetts matches 30 percent of a filer’s federal Earned Income Tax Credit.

fig = px.line(
    # Filter to single person with no children
    df[(df.adults == 1) & (df.children == "3")],
    "employment_income",
    ["de_refundable_eitc", "de_non_refundable_eitc"],
    labels=LABELS,
    title="Delaware EITC for a single person with no children",
    color_discrete_map=COLOR_MAP,
)
fig.update_layout(
    xaxis_tickformat="$,",
    yaxis_tickformat="$,",
    plot_bgcolor="white",
    xaxis_gridcolor=LIGHT_GRAY,
    yaxis_gridcolor=LIGHT_GRAY,
)
fig.show()

Massachusetts Limited Income Credit#

See Schedule NTS-L-NR/PY No Tax Status and Limited Income Credit.

fig = px.line(
    df,
    "employment_income",
    "ma_limited_income_tax_credit",
    color="children",
    animation_frame="adults",
    labels=LABELS,
    title="Massachusetts Limited Income Credit",
    color_discrete_map=COLOR_MAP,
)
fig.update_layout(
    xaxis_tickformat="$,",
    yaxis_tickformat="$,",
    yaxis_range=[0, df.ma_limited_income_tax_credit.max()],
    plot_bgcolor="white",
    xaxis_gridcolor=LIGHT_GRAY,
    yaxis_gridcolor=LIGHT_GRAY,
)
set_bounds(fig, df.employment_income, df.ma_limited_income_tax_credit)
fig.show()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_2918/1981194212.py in <cell line: 1>()
----> 1 fig = px.line(
      2     df,
      3     "employment_income",
      4     "ma_limited_income_tax_credit",
      5     color="children",

/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/plotly/express/_chart_types.py in line(data_frame, x, y, line_group, color, line_dash, symbol, hover_name, hover_data, custom_data, text, facet_row, facet_col, facet_col_wrap, facet_row_spacing, facet_col_spacing, error_x, error_x_minus, error_y, error_y_minus, animation_frame, animation_group, category_orders, labels, orientation, color_discrete_sequence, color_discrete_map, line_dash_sequence, line_dash_map, symbol_sequence, symbol_map, markers, log_x, log_y, range_x, range_y, line_shape, render_mode, title, template, width, height)
    262     a polyline mark in 2D space.
    263     """
--> 264     return make_figure(args=locals(), constructor=go.Scatter)
    265 
    266 

/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/plotly/express/_core.py in make_figure(args, constructor, trace_patch, layout_patch)
   2088     apply_default_cascade(args)
   2089 
-> 2090     args = build_dataframe(args, constructor)
   2091     if constructor in [go.Treemap, go.Sunburst, go.Icicle] and args["path"] is not None:
   2092         args = process_dataframe_hierarchy(args)

/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/plotly/express/_core.py in build_dataframe(args, constructor)
   1490     # now that things have been prepped, we do the systematic rewriting of `args`
   1491 
-> 1492     df_output, wide_id_vars = process_args_into_dataframe(
   1493         args, wide_mode, var_name, value_name
   1494     )

/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/plotly/express/_core.py in process_args_into_dataframe(args, wide_mode, var_name, value_name)
   1211                         if argument == "index":
   1212                             err_msg += "\n To use the index, pass it in directly as `df.index`."
-> 1213                         raise ValueError(err_msg)
   1214                 elif length and len(df_input[argument]) != length:
   1215                     raise ValueError(

ValueError: Value of 'y' is not the name of a column in 'data_frame'. Expected one of ['employment_income', 'de_income_tax', 'de_eitc', 'de_refundable_eitc', 'de_non_refundable_eitc', 'mtr', 'adults', 'children'] but received: ma_limited_income_tax_credit